/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ufes.pss.exercicioSwingBanco.presenter;

import edu.ufes.pss.exercicioSwingBanco.factory.DaoClientePessoaFisicaFactory;
import edu.ufes.pss.exercicioSwingBanco.interfaces.DaoInterface;
import edu.ufes.pss.exercicioSwingBanco.model.ClientePessoaFisica;
import edu.ufes.pss.exercicioSwingBanco.view.CrudClientePessoaFisicaView;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 *
 * @author OdairJT
 */
public class CrudClientePessoaFisicaPresenter {

    private CrudClientePessoaFisicaView view;

    public CrudClientePessoaFisicaPresenter() {

        this.view = new CrudClientePessoaFisicaView();

        addListenerBtnSalvar();
        addListenerBtnFechar();

        this.view.setLocationRelativeTo(null);
        this.view.setVisible(true);

    }

    public CrudClientePessoaFisicaPresenter(String pCpf) {
        this.view = new CrudClientePessoaFisicaView();

        addListenerBtnSalvar();
        addListenerBtnEditar();
        addListenerBtnExcluir();
        addListenerBtnFechar();

        DaoInterface p = DaoClientePessoaFisicaFactory.CriarDaoClientePessoaFisica(1);
        ClientePessoaFisica a = (ClientePessoaFisica) p.buscarObjeto(pCpf);

        this.view.getTxtNome().setText(a.getNome());
        this.view.getTxtCpf().setText(a.getCpf());
        this.view.getTxtEndereco().setText(a.getEndereco());
        this.view.getTxtDataNascimento().setText(a.getDataNascimento());
        this.view.getTxtTelefone().setText(a.getTelefone());
        this.view.getTxtLogin().setText(a.getLogin());

        this.view.getTxtNome().setEnabled(false);
        this.view.getTxtCpf().setEnabled(false);
        this.view.getTxtEndereco().setEnabled(false);
        this.view.getTxtDataNascimento().setEnabled(false);
        this.view.getTxtTelefone().setEnabled(false);
        this.view.getTxtLogin().setEnabled(false);

        this.view.getBtnSalvar().setEnabled(false);
        this.view.getBtnEditar().setEnabled(true);
        this.view.getBtnExcluir().setEnabled(true);

        this.view.setLocationRelativeTo(null);
        this.view.getTxtNome().grabFocus();
        this.view.setVisible(true);
    }

    private void addListenerBtnSalvar() {
        this.view.getBtnSalvar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnSalvar();
            }
        });
    }

    private void actionPerformedBtnSalvar() {
        if (validaDados()) {

            /* O padrão factory retorna a instância de acordo com a forma 
             * de persistencia selecionada
             */

            DaoInterface p = DaoClientePessoaFisicaFactory.CriarDaoClientePessoaFisica(1);

            ClientePessoaFisica cliente;

            cliente = new ClientePessoaFisica(
                    this.view.getTxtNome().getText(),
                    this.view.getTxtEndereco().getText(),
                    this.view.getTxtTelefone().getText(),
                    this.view.getTxtLogin().getText(),
                    this.view.getTxtCpf().getText(),
                    this.view.getTxtDataNascimento().getText());

            if (p.salvarOuAtualizar(cliente)) {
                /* Atualziar listagem via Observer */
                ListaClientePessoaFisicaPresenter listaClientePessoaFisicaPresenter = new ListaClientePessoaFisicaPresenter();
                this.view.dispose();
            }

        } else {
            this.view.showMessage("Dados inválidos!");
        }
    }

    private boolean validaDados() {

        boolean retorno = true;

        if (this.view.getTxtNome().getText().isEmpty()
                || this.view.getTxtCpf().getText().isEmpty()
                || this.view.getTxtEndereco().getText().isEmpty()
                || this.view.getTxtDataNascimento().getText().isEmpty()
                || this.view.getTxtTelefone().getText().isEmpty()
                || this.view.getTxtLogin().getText().isEmpty()) {
            retorno = false;
        }

        return retorno;
    }

    private void addListenerBtnEditar() {
        this.view.getBtnEditar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnEditar();
            }
        });
    }

    private void actionPerformedBtnEditar() {
        this.view.getTxtNome().setEnabled(true);
        this.view.getTxtEndereco().setEnabled(true);
        this.view.getTxtDataNascimento().setEnabled(true);
        this.view.getTxtTelefone().setEnabled(true);
        this.view.getTxtLogin().setEnabled(true);      
        
        this.view.getBtnSalvar().setEnabled(true);
        this.view.getBtnEditar().setEnabled(false);
        this.view.getBtnExcluir().setEnabled(false);
    }

    private void addListenerBtnExcluir() {
        this.view.getBtnExcluir().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnExcluir();
            }
        });
    }

    private void actionPerformedBtnExcluir() {
        /* O padrão factory retorna a instância de acordo com a forma 
         * de persistencia selecionada
         */

        DaoInterface daoClientePessoaFisica = DaoClientePessoaFisicaFactory.CriarDaoClientePessoaFisica(1);

        String cpf = this.view.getTxtCpf().getText();

        ClientePessoaFisica tempClientePessoaFisica = (ClientePessoaFisica) daoClientePessoaFisica.buscarObjeto(cpf);

        if (this.view.showConfirmMessage("Verificação de ação", "Excluir?") == 0) {
            if (daoClientePessoaFisica.excluir(tempClientePessoaFisica)) {
                ListaClientePessoaFisicaPresenter listaClientePessoaFisicaPresenter = new ListaClientePessoaFisicaPresenter();
                this.view.dispose();
            }
        }
    }

    private void addListenerBtnFechar() {
        this.view.getBtnFechar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnFechar();
            }
        });
    }

    private void actionPerformedBtnFechar() {
        ListaClientePessoaFisicaPresenter listaClientePessoaFisicaPresenter = new ListaClientePessoaFisicaPresenter();
        this.view.dispose();
    }
}
